<?php namespace sacvoyage\app;

require_once 'sacvoyage/http/Globals.php';
use \sacvoyage\http\Globals;



class HtmlApplication extends Application {

	public function __construct($html) {
		$this->_html=$html;
	}
	
	public function serve($path) {
		header('Content-type: text/html', true);
		echo $this->_processHtml($this->_html);
	}
	
	private function _processHtml($html) {
		

		$insert_script_to_html=<<<'EOF'
<script type="text/javascript" language="javascript">


// Анализирует заголовки ответа, полученные в XMLHttpRequest, и возвращает
// имена и значения в виде свойств нового объекта.
_parseHeaders = function(request) {
	var headerText = request.getAllResponseHeaders(); // Текст от сервера
	var headers = {}; // Это возвращаемое значение
	var ls = new RegExp("^\\s*"); // Регулярное выражение, удаляющее начальные пробелы
	var ts = /\s*$/; // Регулярное выражение, удаляющее конечные пробелы
	// Разбить заголовки на строки
	var lines = headerText.split("\n");
	// Цикл по всем строкам
	for(var i = 0; i < lines.length; i++) {
		var line = lines[i];
		if (line.length == 0) continue; // Пропустить пустые строки
		// Разбить каждую строку по первому двоеточию и удалить лишние пробелы
		var pos = line.indexOf(':');
		var name = line.substring(0, pos).replace(ls, "").replace(ts, "");
		var value = line.substring(pos+1).replace(ls, "").replace(ts, "");
		// Сохранить пару имя–значение в виде свойства JavaScriptобъекта
		headers[name] = value;
	}
	return headers;
};


_request=function(method, url, body, headers) {
	if(!headers) {
		headers={}
	}
	if(!body) {
		body=null;
	}
	for(i=0; i<3; i++) {
		try {

			request=new XMLHttpRequest();
			request.open(method, url, false);
			for(header in headers) {
				request.setRequestHeader(headers[header]);
			}	
			request.send(body);

			if(Math.floor(request.status/100)!=2) {
				alert("Maybe your session is out of time. Try relogin. \n"+
				      "(Got response status " + request.status + ")");
			}
			
			return {
		        'status':  request.status,
		        'headers': _parseHeaders(request),
		        'body':    request.responseText
		    }
		} catch(exception) {
			// do none and try once-more
		} finally {
			// close request and everything
		}
	}

}





function Collection(url) {
	this._url=url;
}

Collection.prototype.getUrl=function() {
	return this._url;
}

Collection.prototype.write=function(documents) {
	response=_request("POST", this._url, JSON.stringify(documents));
	return JSON.parse(response.body);
}

Collection.prototype.read=function(id, rev) {
	key=id;
	if(rev) {
		key+="~"+rev;
	}
	response=_request("GET", this._url+"/"+encodeURIComponent(key));
	return JSON.parse(response.body);
}

Collection.prototype.find=function(query) {
	if(query) { 
		response=_request("GET", this._url+"?_query="+encodeURIComponent(JSON.stringify(query)));
	} else {
		response=_request("GET", this._url+"/*");
	}
	return JSON.parse(response.body);
}

Collection.prototype.delet=function(query) {
	response=_request("DELETE", this._url+"?_query="+encodeURIComponent(JSON.stringify(query)));
	return JSON.parse(request.body);
}


function Sacvoyage(url) {
	this._url=url;
	this._cache={};
}

Sacvoyage.prototype.getUrl=function() {
	return this._url;
}

Sacvoyage.prototype.getCollectionNames=function() {
	response=_request("GET", this._url+"/*");
	return JSON.parse(response.body);
}

Sacvoyage.prototype.getCollection=function(collectionName) {
	if(!(collectionName in this._cache)) {
		this._cache.collectionName=new Collection(this._url+"/"+collectionName);
	}
	return this._cache.collectionName;
}


sacvoyage=new Sacvoyage('http://example.com');
</script>
EOF;

		$insert_base_url_to_html='<base href="http://example.com"/>';
		
		$script=str_replace(
			'http://example.com', 
			'http://'.Globals::getResourceBaseUrl().'/', 
			$insert_script_to_html
		);
		
		$base=str_replace(
			'http://example.com', 
			'http://'.Globals::getResourceBaseUrl().'/', 
			$insert_base_url_to_html
		);
		
		if(strpos($html, '<head>')!==false) {
			$html=str_replace( 
				'<head>', 
				'<head>'.$base,
				$html
			);
		} elseif(strpos($html, '<head/>')!==false) {
			$html=str_replace( 
				'<head/>', 
				'<head>'.$base.'</head>',
				$html
			);
		}
		
		return $script.$html;
	}
	
	
}


?>
